package com.xxx.utils;

import com.xxx.entity.Permission;
import com.xxx.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class MenuTree {

    /**
     * 生成路由
     * @param menuList 菜单列表
     * * @param pid 父级菜单
     * * @return
     */
    public static List<RouterVo> makeRouter(List<Permission> menuList, Long pid){
        //创建保存路由信息的集合
        List<RouterVo> routerVoList = new ArrayList<RouterVo>();
        //判断菜单是否为空，不为空就使用菜单列表，否则创建集合
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                //筛选不为空的菜单及菜单父id相同的数据
                .stream().filter(item -> item != null && item.getParentId() == pid)
                .forEach(item -> {
                    //创建路由对象
                    RouterVo routerVo = new RouterVo();
                    routerVo.setName(item.getName());//路由名称
                    routerVo.setPath(item.getPath());//路由地址
                    if(item.getParentId() == 0L){
                        routerVo.setComponent("Layout");//一级菜单组件,vue对应的组件名称
                        routerVo.setAlwaysShow(true);//显示路由
                    }else {
                        routerVo.setComponent(item.getUrl());//具体的某一个子菜单组件
                        routerVo.setAlwaysShow(false);//折叠
                    }
                    //设置vue菜单对应的meta信息
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(), item.getIcon(), item.getCode().split(",")));
                    //递归生成路由
                    List<RouterVo> children = makeRouter(menuList, item.getId());//递归生成子菜单
                    routerVo.setChildren(children);//子路由放入路由信息对象中
                    routerVoList.add(routerVo);//将路由信息添加到集合中
                });
        return routerVoList;
    }

    /**
     * 生成菜单树
     *
     * @param meuList
     * @param pid
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> meuList, Long pid) {
        //创建集合保存菜单
        List<Permission> permissionList = new ArrayList<Permission>();
        //如果menuList菜单列表不为空，则使用菜单列表，否则创建集合对象
        Optional.ofNullable(meuList).orElse(new ArrayList<Permission>())
                .stream().filter(item -> item != null && item.getParentId() == pid)
                .forEach(item -> {
                    //创建菜单权限对象
                    Permission permission = new Permission();
                    BeanUtils.copyProperties(item, permission);//复制属性
                    //获取每一个item的下级菜单,递归生成菜单树
                    List<Permission> children = makeMenuTree(meuList, item.getId());
                    permission.setChildren(children);//设置子菜单
                    permissionList.add(permission);//将菜单对象添加到集合
                });
        return permissionList;
    }
}
